#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "hello.h"
#include "base/object.h"

typedef struct tag_hello_private hello_private_t;

struct tag_hello_private {
    hello_t public;
    char * msg;
};

METHOD(hello_t, say_hello, void, hello_private_t * this)
{
    printf("Hello from %s\n", this->msg);
}

METHOD(hello_t, set_msg, void, hello_private_t * this, char * msg)
{
    if (this->msg != NULL) {
        free(this->msg);
    }
    this->msg = strdup(msg);
}

METHOD(hello_t, destory, void, hello_private_t * this)
{
    if (this->msg != NULL) {
        free(this->msg);
    }
    free(this);
}

hello_t * hello_create(void)
{
    hello_private_t * this;
    INIT(this,
        .public = {
            .say_hello = _say_hello,
            .set_msg = _set_msg,
            .destory = _destory });
    this->msg = strdup("hello module");
    return &(this->public);
}